package dao;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import objetos.Usuario;

import sistema.RepositorioDeDados;

import interfaces.IGenericDAO;
import interfaces.IGenericObject;
/**
 * 
 * @author  Filipe Alencar, Felipe J. Cavalcanti, Rodrigo L. de Brito, Thiago Gon�alves, Victor Hugo Arcelino.
 *
 */
public class UsuarioDAO implements IGenericDAO {
	
	private static RepositorioDeDados _repositorio = RepositorioDeDados.getInstance();
	
	

	/**
	 * Cadastra um novo usuario no sistema.
	 * @throws Exception 
	 */
	public void cadastrar(IGenericObject objeto) throws Exception{
		if(objeto instanceof Usuario){
			Usuario user = (Usuario) objeto;
			if(!(existeLogin(user))){
				_repositorio.getUsuarios().add(user);
			}else{
				throw new Exception("Já existe um usuário com este login");
			}
		}
		
	}
	
	private boolean existeLogin(Usuario novoUsuario) {
		for (Usuario usuario : _repositorio.getUsuarios()){
			if (usuario.getLogin().equals(novoUsuario.getLogin())){
				return true;
			}
		}
		return false;
	}

	/**
	 * Permite que o usuario altere seus dados.
	 */
	public void alterar(IGenericObject objeto) {
		List<Usuario> users = _repositorio.getUsuarios();
		if(objeto instanceof Usuario){
			Usuario usuarioAlterado = (Usuario) objeto;
			for (int i = 0; i < users.size(); i++) {
				if(users.get(i).equals(usuarioAlterado)){ 
					users.set(i, usuarioAlterado);
					_repositorio.setUsuarios(users);
				}

			}
		}
	}
	
	/**
	 * Deleta um usuario do sistema.
	 */

	@Override
	public void deletar(IGenericObject objeto)  {
		List<Usuario> usersCadastrados = _repositorio.getUsuarios();
		for(Iterator<Usuario> it = usersCadastrados.iterator(); it.hasNext();){
			Usuario user =  it.next();
			if(user.equals((Usuario)objeto)){
				it.remove();
				_repositorio.setUsuarios(usersCadastrados);
			}
		}

	}
	
	/**
	 * Pesquisa um certo usuario cadastrado no sistema,a partir de uma certa chave.
	 */
	@Override
	public List<IGenericObject> pesquisar(String filtro, String chave)
			throws Exception {
		if(filtro == null || chave == null){
			throw new Exception("Especifique o filtro e a chave da pesquisa.");
		}
		if(filtro.trim().isEmpty() || chave.trim().isEmpty()){
			throw new Exception("Voce deve deve definir o filtro e a chave da pesquisa.");
		}
		if(filtro.equals("nome")){
			return pesquisarPorNomeIncompleto(chave);
		}else if(filtro.equals("nomeCompleto")){
			return pesquisarPorNomeCompleto(chave);
		}else if(filtro.equals("endereco")){
			return pesquisarPorEndereco(chave);
		}else if(filtro.equals("login")){
			return pesquisarPorLogin(chave);
		}else
			throw new Exception("Atributo inexistente");
	}
	
	/**
	 * Pequisa todos os usuarios cadastrados no sistema.
	 */
	@Override
	public List<IGenericObject> pesquisarTodos() {
		List<IGenericObject> usersCadastrados = new ArrayList<IGenericObject>();
		if(! (_repositorio.getUsuarios().isEmpty())){
			for(Usuario user: _repositorio.getUsuarios()){
				if(user instanceof Usuario){
					usersCadastrados.add(user);
				}
			}
		}
		return usersCadastrados;
		
	}
	
	/**
	 * Pesquisa usuarios que tem em seu nome completo o subnome especificado.
	 * @param nome Nome do usuaario.
	 * @return Uma lista de usuarios que possuem o nome especificado na pesquisa.
	 */
	
	private List<IGenericObject> pesquisarPorNomeIncompleto(String nome){
		List<IGenericObject> usersCadastrados = pesquisarTodos();
		List<IGenericObject> resultado = new ArrayList<IGenericObject>();
		if(!usersCadastrados.isEmpty()){
			for (IGenericObject user : usersCadastrados) {
				if(((Usuario)user).getNome().contains(nome)){
					resultado.add(user);
				}
			}
		}
		return resultado;
	}
	
	/**
	 * Pesquisa um usuario atraves de seu nome completo.
	 * @param nome Nome completo do usario.
	 * @return Uma lista com o usuario pesquisado.
	 */
	private List<IGenericObject> pesquisarPorNomeCompleto(String nome){
		List<IGenericObject> usersCadastrados = pesquisarTodos();
		List<IGenericObject> resultado = new ArrayList<IGenericObject>();
		if(!usersCadastrados.isEmpty()){
			for (IGenericObject user : usersCadastrados) {
				if(((Usuario)user).getNome().equalsIgnoreCase(nome)){
					resultado.add(user);
				}
			}
		}
		return resultado;
	}
	
	/**
	 * Pesquisa usuario pelo login.
	 * @param login O login do usuario.
	 * @return Lista contendo o usuario pesquisado.
	 */
	private List<IGenericObject> pesquisarPorLogin(String login){
		List<IGenericObject> usersCadastrados = pesquisarTodos();
		List<IGenericObject> resultado = new ArrayList<IGenericObject>();
		if(!usersCadastrados.isEmpty()){
			for (IGenericObject user : usersCadastrados) {
				if(((Usuario)user).getLogin().equals(login)){
					resultado.add(user);
				}
			}
		}
		return resultado;
	}
	
	/**
	 * Pesquisa usuarios pelo endereco.
	 * @param nome Endereco do usuario.
	 * @return Uma lista de usuarios que possuem o endereco especificado na pesquisa.
	 */
	private List<IGenericObject> pesquisarPorEndereco(String endereco){
		List<IGenericObject> usersCadastrados = pesquisarTodos();
		List<IGenericObject> resultado = new ArrayList<IGenericObject>();
		if(!usersCadastrados.isEmpty()){
			for (IGenericObject user : usersCadastrados) {
				if(((Usuario)user).getEndereco().contains((endereco))){ 
					resultado.add(user);
				}
			}
		}
		return resultado;
	}
}